package club.jdiy.utils;

import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * JDiy常用反射操作工具类.
 *
 * @author ziquee(子秋) QQ号:39886616 主页: http://www.jdiy.club
 * @version 20201022
 */
public class ReflexUtils {
    /**
     * 获取给定Class类的所有 setter 方法并封装返回.
     *
     * @param clazz 目标类
     * @return map的key值为属性名，Value值为该setter　Method方法
     */
    public static Map<String, Method> getSetters(Class<?> clazz) {
        return Arrays.stream(clazz.getMethods())
                .filter(m -> m.getParameterTypes().length == 1 && m.getName().length() > 3 && m.getName().startsWith("set"))
                .collect(Collectors.toMap(
                        o -> o.getName().substring(3, 4).toLowerCase() + o.getName().substring(4),
                        Function.identity(),
                        (v1,v2) -> v1
                ));
    }

    /**
     * 获取给定Class类的所有 getter 方法并封装返回.
     *
     * @param clazz 目标类
     * @return map的key值为属性名，Value值为该setter Method方法．
     */
    public static Map<String, Method> getGetters(Class<?> clazz) {
        return Arrays.stream(clazz.getMethods())
                .filter(m -> {
                    String n = m.getName();
                    return m.getParameterTypes().length == 0 && !"getClass".equals(n) &&
                            (n.startsWith("is") && n.length() > 2 || n.startsWith("get") && n.length() > 3);
                }).collect(Collectors.toMap(
                        o -> (o.getName().startsWith("get") ? o.getName().substring(3, 4).toLowerCase() + o.getName().substring(4)
                                : o.getName().substring(2, 3).toLowerCase() + o.getName().substring(3)),
                        Function.identity(),
                        (v1,v2) -> v1
                ));
    }
}
